/**
 * @author laixuemei
 * @time 2022-01-17
 * @description 定义项目的通用状态数据
 */
import { AES, enc } from 'crypto-js'
import { SET_TOKEN, SET_USERINFO, CLEAR_DATA, MENU_LIST } from '../types'
// 定义秘钥
const YIBAIYUN = 'yibaiyun'

// 在这个文件进行初始化的时候，会对redux中的state数据进行重置
// 所以可以在这里获取当前的缓存数据
let cache = sessionStorage.getItem('react-myCache')

// 定义一个空对象
const myInit = {
    token: '',
    userInfo: {},
    menuList: []
}

// 避免JSON.parse出现错误终止我们的程序，所以使用了try...catch
// 如果用户首次进入系统，cache是一个null对象，不能进行解密
try {
    let myCache = AES.decrypt(cache, YIBAIYUN).toString(enc.Utf8)
    // 第一步要处理解密的结果 如果结果为真
    if(!!myCache) {
        // 对解密的结果进行转换
        try {
            cache = JSON.parse(myCache) || myInit
        } catch {
            // json.parse错误,转换错误执行
            cache = myInit
        }
    } else {
        cache = myInit
    }
} catch {
    // 解密失败
    cache = myInit
}

// 初始化数据
const initState = {
    token: cache.token,
    userInfo: cache.userInfo,
    menuList: cache.menuList
}

export default function reducer(state = initState, action) {
    // console.log(action)
    let newState = JSON.parse(JSON.stringify(state))
    switch(action.type){
        case SET_TOKEN:
            newState.token = action.token
            break
        case SET_USERINFO:
            newState.userInfo = action.userInfo
            break
        case MENU_LIST:
            newState.menuList = action.menuList
            break
        // 此处是退出首页时的清除数据
        case CLEAR_DATA:
            // console.log('退出')
            newState = JSON.parse(JSON.stringify(myInit))
            break
        default:
            break
    }
    // 页面刷新数据会丢失，所以在数据进行缓存到store.state之前,直接把它缓存到sessionStorage中
    // 使用对称加密，把缓存的数据进行加密处理，避免数据泄露
    let myCache = AES.encrypt(JSON.stringify(newState), YIBAIYUN).toString()
    sessionStorage.setItem('react-myCache', myCache)

    return newState
}